static kmem_cache_t *buffer_head_cachep;
#else
static request_queue_t *plugged_queue;
-void bdev_put(struct block_device *bdev)
+static inline void bdev_flush_queue(request_queue_t *q)
{
- request_queue_t *q = plugged_queue;
- /* We might be giving up last reference to plugged queue. Flush if so. */
- if ( (q != NULL) &&
- (q == bdev_get_queue(bdev)) &&
- (cmpxchg(&plugged_queue, q, NULL) == q) )
- blk_run_queue(q);
- /* It's now safe to drop the block device. */
- blkdev_put(bdev);
+ if ( q->unplug_fn != NULL )
+ q->unplug_fn(q);
}
#endif
#else
if ( plugged_queue != NULL )
{
- blk_run_queue(plugged_queue);
+ bdev_flush_queue(plugged_queue);
plugged_queue = NULL;
}
#endif
if ( (q = bdev_get_queue(bio->bi_bdev)) != plugged_queue )
{
if ( plugged_queue != NULL )
- blk_run_queue(plugged_queue);
+ bdev_flush_queue(plugged_queue);
plugged_queue = q;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
typedef struct rb_root rb_root_t;
typedef struct rb_node rb_node_t;
-extern void bdev_put(struct block_device *bdev);
#else
struct block_device;
-#define bdev_put(_b) ((void)0)
#endif
typedef struct blkif_st {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
static dev_t vbd_map_devnum(blkif_pdev_t);
+#define bdev_put(_b) blkdev_put(_b)
+#else
+#define bdev_put(_b) ((void)0)
#endif
void vbd_create(blkif_be_vbd_create_t *create)